<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Source: janusvideoroom.js</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Source: janusvideoroom.js</h1>

    



    
    <section>
        <article>
            <pre class="prettyprint source linenums"><code>//var JanusVideoRoom = (function() {

	
/** 
 * Interface with Janus Gateway Video Room and WebRTC-streamer API
 * @constructor
 * @param {string} janusUrl - url of Janus Gateway
 * @param {string} srvurl - url of WebRTC-streamer
*/
var JanusVideoRoom = function JanusVideoRoom (janusUrl, srvurl) {	
	this.janusUrl    = janusUrl;
	this.handlers    = [];
	this.srvurl      = srvurl || location.protocol+"//"+window.location.hostname+":"+window.location.port;
	this.connection  = [];
};
	
/** 
* Ask to publish a stream from WebRTC-streamer in a Janus Video Room user
 * @param {string} janusroomid - id of the Janus Video Room to join
 * @param {string} url - WebRTC stream to publish
 * @param {string} name - name in  Janus Video Room
*/
JanusVideoRoom.prototype.join = function(janusroomid, url, name) {
	// create a session
	var createReq = {janus: "create", transaction: Math.random().toString() };

		var bind = this;
		request("POST" , this.janusUrl,
			{	
				body: JSON.stringify(createReq),
			}).done( function (response) { 
				if (response.statusCode === 200) {
					bind.onCreateSession(JSON.parse(response.body), janusroomid, url, name);
				}
				else {
					bind.onError(response.statusCode);
				}
			}
		);
}

/**
* Ask to unpublish a stream from WebRTC-streamer in a Janus Video Room user
 * @param {string} janusroomid - id of the Janus Video Room to join
 * @param {string} url - WebRTC stream to publish
 * @param {string} name - name in  Janus Video Room
*/
JanusVideoRoom.prototype.leave = function(janusroomid, url, name) {
	var connection = this.connection[janusroomid + "_" + url + "_" + name];
	if (connection) {
		var sessionId = connection.sessionId;
		var pluginid  = connection.pluginId;
		
		var leaveReq = { "janus": "message", "body": {"request": "unpublish"}, "transaction": Math.random().toString() };
		
		var bind = this;
		request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid,
			{	
				body: JSON.stringify(leaveReq),
			}).done( function (response) { 
				if (response.statusCode === 200) {
					console.log("leave janus room answer:" + response.body);
				}
				else {
					bind.onError(response.statusCode);
				}
			}
		);
	}
}

/**
* subscribeEvents
 * @param {string} fn - funtcion to call
*/
JanusVideoRoom.prototype.subscribeEvents = function(fn) {
	this.handlers.push(fn);
}

// ------------------------------------------
// callback 
// ------------------------------------------
JanusVideoRoom.prototype.callback = function(name, state) {
	this.handlers.forEach(function(item) { 
		item(name,state);
	});
}

// ------------------------------------------
// Janus callback for Session Creation
// ------------------------------------------
JanusVideoRoom.prototype.onCreateSession = function(dataJson, janusroomid, url, name) {
	var sessionId = dataJson.data.id;
	console.log("onCreateSession sessionId:" + sessionId);
	
	// attach to video room plugin
	var attachReq = { "janus": "attach", "plugin": "janus.plugin.videoroom", "transaction": Math.random().toString() };			
	
	var bind = this;
	request("POST" , this.janusUrl + "/" + sessionId,
		{	
			body: JSON.stringify(attachReq),
		}).done( function (response) { 
			if (response.statusCode === 200) {
				bind.onPluginsAttached(JSON.parse(response.body), janusroomid, url, name, sessionId);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);
}
	
// ------------------------------------------
// Janus callback for Video Room Plugins Connection
// ------------------------------------------
JanusVideoRoom.prototype.onPluginsAttached = function(dataJson, janusroomid, url, name, sessionId) {
	var pluginid = dataJson.data.id;
	console.log("onPluginsAttached pluginid:" + pluginid);
	
	this.callback(name, "joining");

	var joinReq = {"janus":"message","body":{"request":"join","room":janusroomid,"ptype":"publisher","display":name},"transaction":Math.random().toString()};
	
	var bind = this;
	request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid,
		{	
			body: JSON.stringify(joinReq),
		}).done( function (response) { 
			if (response.statusCode === 200) {
				bind.onJoinRoom(JSON.parse(response.body), janusroomid, url, name, sessionId, pluginid);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);
}

// ------------------------------------------
// Janus callback for Video Room Joined
// ------------------------------------------
JanusVideoRoom.prototype.onJoinRoom = function(dataJson,janusroomid,url,name,sessionId,pluginid) {
	console.log("onJoinRoom:" + JSON.stringify(dataJson));

	var bind = this;
	request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&amp;maxev=1")
		.done( function (response) { 
			if (response.statusCode === 200) {
				bind.onJoinRoomResult(JSON.parse(response.body), janusroomid, url, name, sessionId, pluginid);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);
}

// ------------------------------------------
// Janus callback for Video Room Joined
// ------------------------------------------
JanusVideoRoom.prototype.onJoinRoomResult = function(dataJson,janusroomid,url,name,sessionId,pluginid) {
	console.log("onJoinRoomResult:" + JSON.stringify(dataJson));

	if (dataJson.plugindata.data.videoroom === "joined") {	
		// register connection
		this.connection[janusroomid + "_" + url + "_" + name] = {"sessionId":sessionId, "pluginId": pluginid };
		
		// notify new state
		this.callback(name, "joined");
		
		var peerid = Math.random().toString();
		
		var createOfferUrl = this.srvurl + "/api/createOffer?peerid="+ peerid+"&amp;url="+encodeURIComponent(url.video);
		if (url.audio) {
			createOfferUrl += "&amp;audiourl="+encodeURIComponent(url.audio);
		}
		var bind = this;
		request("GET" , createOfferUrl)
			.done( function (response) { 
				if (response.statusCode === 200) {
					bind.onCreateOffer(JSON.parse(response.body), name, sessionId, pluginid, peerid);
				}
				else {
					bind.onError(response.statusCode);
				}
			}
		);		
	} else {
		this.callback(name, "joining room failed");
	}
}

// ------------------------------------------
// WebRTC streamer callback for Offer 
// ------------------------------------------
JanusVideoRoom.prototype.onCreateOffer = function(dataJson,name,sessionId,pluginid,peerid) {
	console.log("onCreateOffer:" + JSON.stringify(dataJson));
	
	this.callback(name, "publishing");
	
	var publishReq = { "janus": "message", "body": {"request": "publish", "video": true, "audio": true, "data": true}, "jsep": dataJson, "transaction": Math.random().toString() };		
	var bind = this;
	request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid,
		{	
			body: JSON.stringify(publishReq),
		}).done( function (response) { 
			if (response.statusCode === 200) {
				bind.onPublishStream(JSON.parse(response.body), name, sessionId, pluginid, peerid);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);		
}

// ------------------------------------------
// Janus callback for WebRTC stream is published
// ------------------------------------------
JanusVideoRoom.prototype.onPublishStream = function(dataJson,name,sessionId,pluginid,peerid) {
	console.log("onPublishStream:" + JSON.stringify(dataJson));

	var bind = this;
	request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&amp;maxev=1")
		.done( function (response) { 
			if (response.statusCode === 200) {
				bind.onPublishStreamResult(JSON.parse(response.body), name, sessionId, pluginid, peerid);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);		
}

// ------------------------------------------
// Janus callback for WebRTC stream is published
// ------------------------------------------
JanusVideoRoom.prototype.onPublishStreamResult = function(dataJson,name,sessionId,pluginid,peerid) {
	console.log("onPublishStreamResult:" + JSON.stringify(dataJson));

	if (dataJson.jsep) {
		var bind = this;
		request("POST" , this.srvurl + "/api/setAnswer?peerid="+ peerid,
			{	
				body: JSON.stringify(dataJson.jsep),
			}).done( function (response) { 
				if (response.statusCode === 200) {
					bind.onSetAnswer(JSON.parse(response.body), name, sessionId, pluginid, peerid);
				}
				else {
					bind.onError(response.statusCode);
				}
			}
		);		
	} else {
		this.callback(name, "publishing failed (no SDP)");
	}
}

// ------------------------------------------
// WebRTC streamer callback for Answer 
// ------------------------------------------
JanusVideoRoom.prototype.onSetAnswer = function(dataJson,name,sessionId,pluginid,peerid) {
	console.log("onSetAnswer:" + JSON.stringify(dataJson));
	
	var bind = this;
	request("GET" , this.srvurl + "/api/getIceCandidate?peerid="+peerid)
		.done( function (response) { 
			if (response.statusCode === 200) {
				bind.onReceiveCandidate(JSON.parse(response.body), name, sessionId, pluginid);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);		
}

// ------------------------------------------
// WebRTC streamer callback for ICE candidate 
// ------------------------------------------
JanusVideoRoom.prototype.onReceiveCandidate = function(dataJson,name,sessionId,pluginid) {
	console.log("onReceiveCandidate answer:" + JSON.stringify(dataJson));
	
	for (var i=0; i&lt;dataJson.length; i++) {
		// send ICE candidate to Janus
		var candidateReq = { "janus": "trickle", "candidate": dataJson[i], "transaction": Math.random().toString()  };
		
		var bind = this;
		request("POST" , this.janusUrl + "/" + sessionId + "/" + pluginid,
			{	
				body: JSON.stringify(candidateReq),
			}).done( function (response) { 
				if (response.statusCode === 200) {
					console.log("onReceiveCandidate janus answer:" + response.body);
				}
				else {
					bind.onError(response.statusCode);
				}
			}
		);		
	}
	
	// start long polling
	this.longpoll(null, name, sessionId);	
}

// ------------------------------------------
// Janus callback for keepAlive Session
// ------------------------------------------
JanusVideoRoom.prototype.keepAlive = function(sessionId) {
	var keepAliveReq = { "janus": "keepalive", "session_id": sessionId, "transaction": Math.random().toString()  };
	
	var bind = this;
	request("POST" , this.janusUrl + "/" + sessionId,
		{	
			body: JSON.stringify(keepAliveReq),
		}).done( function (response) { 
			if (response.statusCode === 200) {
				console.log("keepAlive:" + response.body);
			}
			else {
				bind.onError(response.statusCode);
			}
		}
	);		
}

// ------------------------------------------
// Janus callback for Long Polling
// ------------------------------------------
JanusVideoRoom.prototype.longpoll = function(dataJson, name, sessionId) {
	if (dataJson) {
		console.log("poll evt:" + JSON.stringify(dataJson));
	
		if (dataJson.janus === "webrtcup") {
			// notify connection
			this.callback(name, "up");
			
			// start keep alive
			var bind = this;
			setInterval( function() { bind.keepAlive(sessionId); }, 10000);	
		}
		else if (dataJson.janus === "hangup") {
			// notify connection
			this.callback(name, "down");
		}
	}
	
	var bind = this;
	request("GET" , this.janusUrl + "/" + sessionId + "?rid=" + new Date().getTime() + "&amp;maxev=1")
		.done( function (response) { 
			bind.longpoll( JSON.parse(response.body), name, sessionId);
		}
	);		
}

// ------------------------------------------
// Janus callback for Error
// ------------------------------------------
JanusVideoRoom.prototype.onError = function(status) {
	console.log("onError:" + status);
}


//return JanusVideoRoom;
//})();

//module.exports = JanusVideoRoom;
</code></pre>
        </article>
    </section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="JanusVideoRoom.html">JanusVideoRoom</a></li><li><a href="WebRtcStreamer.html">WebRtcStreamer</a></li><li><a href="XMPPVideoRoom.html">XMPPVideoRoom</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Sat Aug 25 2018 15:00:27 GMT+0200 (CEST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>
